#include<iostream>
using namespace std;
#include"block_queue.hpp"
#include<time.h>
#include"Task.hpp"

int myadd(int x,int y){
    return x+y;
}


void makeseek(){
    srand((unsigned int)time(nullptr)^getpid());
}

//消费者
void* start_consumer(void* args){
    block_queue<Task>* bq = static_cast<block_queue<Task>*>(args);
    while(true){
        //消费活动
        Task data;
        bq->pop(&data);
        //bq->pop(&data);//输出型函数
        cout<<"消费者消费的数据:"<<data()<<endl;
        sleep(1);

    }
    return nullptr;
}


//生产者
void* start_provider(void* args){
    block_queue<Task>* bq = static_cast<block_queue<Task>*>(args);
    while(true){
        //生产活动
        int data1 = rand()%10+1;
        int data2 = rand()%5+1;
        Task t(data1,data2,myadd);//由于使用了仿函数，所以Task创建的对象可以直接当函数使用

        bq->push(t);
        //cout<<"生产者已经生产数据："<<<<endl;
        sleep(1);
    }
    return nullptr;
}


int main(){
    makeseek();
    //创建2个新线程来充当消费者和生产者
    block_queue<Task>* bq = new block_queue<Task>();

    pthread_t c,p;
    //第4个参数都是这个阻塞队列，因为他们要看到同一块共享资源
    pthread_create(&c,nullptr,start_consumer,bq);
    pthread_create(&p,nullptr,start_provider,bq);



    //等待线程
    pthread_join(c,nullptr);
    pthread_join(p,nullptr);







    return 0;
}

